#ifndef	_J_RED_H_
#define	_J_RED_H_

#include "dretve.h"

//javno  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void j_redovi_inicijaliziraj();

int j_dohvati_red (uint8 tip, int8 sort, uint16 zast);
int j_obrisi_red (int id);

//osnovne operacije nad redovima - interne funkcije jezgre!

//stavi na kraj reda (ili prema prioritetu, ako je takav red)
void j_stavi_u_red (int red, void *opd);

//pronadji i makni dretvu iz reda (npr. zato jer je 'nasilno' zavrsavamo)
int j_makni_iz_reda (int red, void *opd);

//prvu dretvu iz reda (ili sve) stavi u red pripravnih
int j_propusti_iz_reda (int red, bool sve);

#define SORT_PRP	1
#define SORT_PRIO	2

//javno  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#if defined(_J_RED_C_) || defined(_J_DRETVE_C_) || defined(_J_SINKRONIZACIJA_C_)

//pomocna za provjeru valjanosti reda
int j_provjeri_red(int id);

#define PRVIRED	2	//preskacem prva dva indeksa: 0-aktivna i 1-pripravne

//genericki red
typedef struct _jred_t_ {
	uint8 tip;		//identifikacija tipa reda => jedno od
				//blokiranih stanja dretve
	union {
		int8 sort;	//org. po redu prispjeca (0) ili prioritetu (1)
		int8 slobodno;	//SLOBODNO (-1) kada se red ne koristi
	};
	uint16 zast;		//zastavice - interpretacija ovisi o upotrebi

	lista_dretvi_t red;	//blokirane dretve u redu
	
	//dodatni broj za razne potrebe (semafori, ui, ...)
	int pr;			//"prosirenje"
} j_red_t;

#define USPOREDI_PRIO(a, b)	((a->prio) - (b->prio))

#endif	/* _J_RED_C_ & ostali */
#endif	/* _J_RED_H_ */